package com.tiger.utils;

import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.http.Method;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author HuXuehao (StudiousTiger)
 * @desc 这个类的作用是 用于获取最新的MINIO的URL，并更新响应的内容
 * @date 2022/6/12
 */
@Component
public class UpdateUtils {
    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucketName}")
    private String bucketNameOfPicture;
    @Value("${minio.bucketNameOfXls}")
    private String bucketNameOfXls;

    /**
     * 更新markdown文本中的图片链接表达式
     * @param targetTxt 待更新的markdown文本
     * @param bucketName 存桶放图片的
     * @return 更新完本文中图片链接表达式后的markdown文本
     * @throws Exception
     */
    public String updateMDOfImgURL(String targetTxt, String bucketName) throws Exception {
        // 1. 过滤图片名
        List<String> imgNames = filterImgNames(targetTxt);

        // 2. 获取新的图片url语法
        List<String> newImgUrl = new ArrayList<String>();
        for (int i = 0; i < imgNames.size(); i++) {
            // 重新获取图片链接
            String imgURL = minioClient.getPresignedObjectUrl(
                    GetPresignedObjectUrlArgs
                            .builder()
                            .method(Method.GET)
                            .bucket(bucketName)
                            .object(imgNames.get(i))
                            .build());
            newImgUrl.add("![添加描述]("+imgURL+")");
        }

        // 3. 获取旧的url
        List<String> oldImgUrl = getOldImgUrl(targetTxt);

        // 4. 重构md
        String mdTxt = rebuildMD(targetTxt,  oldImgUrl, newImgUrl);

        return mdTxt;
    }
    /**
     * 过滤出所有的图片名
     * @param txt
     * @return
     */
    private List<String> filterImgNames(String txt){
        // 匹配 ![...](...)  ， “.+” 表示除了回车外的任意值
        Pattern pattern = Pattern.compile("!\\[.+][(].+[)]");
        Matcher matcher = pattern.matcher(txt);
        ArrayList<String> arrayList = new ArrayList<String>();
        while (matcher.find()) {
            // 获取img url链接
            String group = matcher.group(0);
            // 根据？将url进行拆分，获取第一段。根据 “/” 将url进行拆分，获取最后一段（图片名）。
            String[] arr = group.split("\\?")[0].split("/");
            // 判断是否为图片名
            if (isImg(arr[arr.length-1])) {
                arrayList.add(arr[arr.length-1]);
            } else {
                continue;
            }
        }
        return arrayList;
    }
    /**
     * 重构md文本
     * @param oldTxt
     * @param oldImgUrl 旧的md图片url语法
     * @param newImgUrl 新的md图片url语法
     * @return 重构后的md文本
     */
    private String rebuildMD(String oldTxt, List<String> oldImgUrl, List<String> newImgUrl){
        for (int i = 0; i < newImgUrl.size(); i++) {
            oldTxt = oldTxt.replace(oldImgUrl.get(i), newImgUrl.get(i));
        }
        return oldTxt;
    }
    /**
     * 判断 字符串是不是图片
     * @param imgName
     * @return
     */
    private boolean isImg(String imgName){
        String str = "bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp,avif,apng";
        String[] imgEnd = str.split(",");
        for (String end : imgEnd) {
            if (imgName.contains(end)){
                return true;
            } else {
                continue;
            }
        }
        return false;
    }
    /**
     * 获取旧的md图片url语法
     * @param txt
     * @return
     */
    private List<String> getOldImgUrl(String txt){
        // 匹配 ![...](...)  ， “.+” 表示除了回车外的任意值
        Pattern pattern = Pattern.compile("!\\[.+][(].+[)]");
        Matcher matcher = pattern.matcher(txt);
        List<String> arrayList = new ArrayList<String>();
        while (matcher.find()) {
            arrayList.add(matcher.group(0));
        }
        return arrayList;
    }

    /**
     * 根据头像的图片名获取头像的url
     * @param imgName 头像的图片名
     * @return 获取到的最新的url连接
     * @throws Exception
     */
    public String getNewHeadPhotoURL(String imgName) throws Exception{
        String imgURL = minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs
                        .builder()
                        .method(Method.GET)
                        .bucket(bucketNameOfPicture)
                        .object(imgName)
                        .build());

        return imgURL;
    }

    /**
     * 根据excel名获取excel的url
     * @param excelName
     * @return
     * @throws Exception
     */
    public String getExcelURL(String excelName) throws Exception{
        String imgURL = minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs
                        .builder()
                        .method(Method.GET)
                        .bucket(bucketNameOfXls)
                        .object(excelName)
                        .build());

        return imgURL;
    }
}
